#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：tools 
@File ：成品物料合同分配.py
@IDE  ：PyCharm 
@Author ：李涵彬
@Date ：2024/11/18 下午3:27 
"""

"""
成品物料合同分配程序

输入：合同资源表路径，库存资源表路径，库存表完善字段列表，库存表匹配字段列表

处理逻辑：
1.分别读取合同表和资源表，逐行遍历库存资源表，根据库存表匹配字段列表，到合同资源表中进行数据筛选匹配
2.如果不存在匹配结果，那么跳过这行
3.如果存在一条匹配结果，则使用合同资源表中的字段完善库存表字段，范围是库存表完善字段列表中的字段
4.如果存在多条匹配结果，则在控制台进行打印合同数据，等待控制台输入选择之后，补全库存表
5.匹配的数据不再重复使用
"""

import pandas as pd
import os
from typing import List


def read_table(file_path: str) -> pd.DataFrame:
	"""
	根据文件扩展名读取表格数据。

	参数:
	file_path (str): 文件路径。

	返回:
	pd.DataFrame: 读取的表格数据。
	"""
	if file_path.endswith('.csv'):
		return pd.read_csv(file_path)
	elif file_path.endswith(('.xls', '.xlsx')):
		return pd.read_excel(file_path)
	else:
		raise ValueError("Unsupported file format")


def match_and_update(contract_table: pd.DataFrame, inventory_table: pd.DataFrame,
					 match_fields: List[str], update_fields: List[str]) -> pd.DataFrame:
	"""
	遍历库存资源表，匹配合同资源表，并更新库存表。

	参数:
	contract_table (pd.DataFrame): 合同资源表。
	inventory_table (pd.DataFrame): 库存资源表。
	match_fields (List[str]): 库存表匹配字段列表。
	update_fields (List[str]): 库存表完善字段列表。

	返回:
	pd.DataFrame: 更新后的库存资源表。
	"""
	for index, inventory_row in inventory_table.iterrows():
		# 根据匹配字段列表筛选合同资源表
		match_results = contract_table[contract_table.apply(
			lambda row: row[match_fields].equals(inventory_row[match_fields]), axis=1
		)]

		if match_results.empty:
			# 如果不存在匹配结果，跳过这行
			continue

		if len(match_results) == 1:
			# 如果存在一条匹配结果，更新库存表
			for field in update_fields:
				inventory_table.at[index, field] = match_results[field].values[0]
		else:
			# 如果存在多条匹配结果，打印合同数据，等待控制台输入选择
			print("Multiple matches found for inventory item:")
			for i, match in match_results.iterrows():
				print(f"{i + 1}: {match[match_fields].tolist()}")
			choice = int(input("Enter the number of the contract to update: "))
			if 1 <= choice <= len(match_results):
				selected_match = match_results.iloc[choice - 1]
				for field in update_fields:
					inventory_table.at[index, field] = selected_match[field]
			else:
				print("Invalid choice, skipping update.")

	return inventory_table


def save_result(inventory_path: str, result: pd.DataFrame) -> None:
	"""
	将结果保存到xlsx文件中。

	参数:
	inventory_path (str): 原始库存表文件路径。
	result (pd.DataFrame): 更新后的库存表。
	"""
	# 获取原始库存表的目录
	directory = os.path.dirname(inventory_path)
	# 构造结果文件的完整路径
	result_path = os.path.join(directory, 'result.xlsx')
	# 保存结果文件
	result.to_excel(result_path, index=False)
	print(f"Result saved to {result_path}")


def main(contract_path: str, inventory_path: str, match_fields: List[str], update_fields: List[str]) -> None:
	"""
	主函数，处理合同和库存表的匹配和更新。

	参数:
	contract_path (str): 合同资源表文件路径。
	inventory_path (str): 库存资源表文件路径。
	match_fields (List[str]): 库存表匹配字段列表。
	update_fields (List[str]): 库存表完善字段列表。
	"""
	try:
		contract_table = read_table(contract_path)
		inventory_table = read_table(inventory_path)
		updated_inventory = match_and_update(contract_table, inventory_table, match_fields, update_fields)
		save_result(inventory_path, updated_inventory)
	except Exception as e:
		print(f"An error occurred: {e}")


# 示例使用
if __name__ == "__main__":
	contract_path = 'path_to_contract.csv'  # 根据实际情况替换文件路径和格式
	inventory_path = 'path_to_inventory.xlsx'  # 根据实际情况替换文件路径和格式
	match_fields = ['field1', 'field2']  # 根据实际情况替换字段名
	update_fields = ['field3', 'field4']  # 根据实际情况替换字段名

	main(contract_path, inventory_path, match_fields, update_fields)
